【BUAA 您所在的位置:网站首页 life on mars是什么意思 【BUAA

【BUAA

2024-01-27 18:54| 来源: 网络整理| 查看: 265

MARS帮助文档整理_基础指令

// 根据MARS源文档进行字典序排列,为方便理解有一些顺序调动,以供学习参考

// 如有错误,请不吝赐教

*$f_ -> 浮点数寄存器(后面的数字单双表示单双精度)

*$t -> 整数寄存器

*PC (Program Counter):用于存储当前CPU正在执行的指令在内存中的地址

*协同处理器Coprocessor被缩写为Coproc或者c或者CP

*其他对操作数描述的详尽说明:

在这里插入图片描述

浮点数绝对值计算_ABS

abs.d $f2, $f4 $f2 = |$f4|(双精度)

abs.s $f0, $f1 $f0 = |$f1|(单精度)

加法运算_ADD 格式功能概述备注add $t1, $t2, $t3$t1 = $t2 + $t3考虑溢出的整数加法add.d $f2, $f4, $f6$f2 = $f4 + $f6双精度浮点数加法add.s $f0, $f1, $f3$f0 = $f1 + $f3单精度浮点数加法addi $t1, $t2, -100$t1 = $t2 + 一个16位有符号立即数-32768 ~ 32767,考虑溢出的整数加法addiu $t1, $t2, -100$t1 = $t2 + 一个16位无符号立即数0 ~ 65535,无溢出检测的整数加法addu $t1, $t2, $t3$t1 = $t2 + $t3无溢出检测的整数加法

// 无符号Unsigned是一种误导,意思就是不考虑溢出

按位与运算_AND

and $t1, $t2, $t3 按位与 : $t1 = $t2 & $t3

andi $t1, $t2, 100 跟一个16位无符号立即数的按位与:$t1 = $t2 & 一个16位无符号立即数(对此数进行0扩展以后再进行运算)

跳啊跳啊_Branch

和PC相关的相对寻址指令(地址计算依赖于PC值)称为分支(branch),助记词以b开头。

格式功能概述备注bc1f 1, label如果1处表示的具体状态标记flag(Condition Flag)的值是false,也即0,则跳转到地址在label中的语句注意是bc1f, 不要把数字1写成字母l,下同(其实只要记住c1指代的是Coprocessor1就可以);同时注意示例中的1表示的是状态标记,可以是0 ~ 7的任意数字,可以参见MARS寄存器状态栏中的Coproc 1一栏bc1f label如果Coproc 1中的flag 0(也即状态栏中的$f0)值为false,也即0,则跳转到地址在label中的语句Branch if Crproc1 Falsebc1t 1, label如果1处表示的具体状态标记flag的值是true,也即1,则跳转到地址在label中的语句bc1t label如果Coproc 1中的flag 0(也即状态栏中的$f0)值为true,也即1,则跳转到地址在label中的语句Branch if Crproc1 Truebeq $t1, $t2, label如果 $t1 = $t2,则跳转到地址在label中的语句Branch if EQualbgez $t1, label如果 $t1 >= 0,则跳转到地址在label中的语句Branch if Greater than or Equal to Zerobgezal $t1, label如果 $t1 >= 0, 则PC跳转到地址在label中的语句(可以是一个子程序,比如test),无论调用是否发生,返回地址一律保存到寄存器$ra中。Branch if Greater than or Equal to Zero And Linkbgtz $t1, label如果 $t1 > 0,则跳转到地址在label中的语句Branch if Greater Than Zeroblez $t1, label如果 $t1 = 0, 则PC跳转到地址在label中的语句(可以是一个子程序,比如test),无论调用是否发生,返回地址一律保存到寄存器$ra中。Branch if Less Than Zero And Linkbne $t1, $t2, label如果 $t1 != $t2,则跳转到地址在label中的语句Branch if Not Equal 停止执行_Break

break 终止异常执行的程序的运行

break 100 以指定的异常码(16位无符号数)终止异常执行的程序的运行

比较_Compare 格式功能概述备注c.eq.d $f2, $f4如果**$f2 = $f4**,将Coproc1中的flag 0 置1(true),否则置0(false)d:双精度浮点数比较,下同c.eq.d 1, $f2, $f4如果**$f2 = $f4**,将Coproc1中的flag 0 置立即数表示的具体数值(true),否则置0(false)c.eq.s $f0, $f1如果**$f0 = $f1**,将Coproc1中的flag 0 置1(true),否则置0(false)s:单精度浮点数比较,下同c.eq.s 1, $f0, $f1如果**$f0 = $f1**,将Coproc1中的flag 0 置立即数表示的具体数值(true),否则置0(false)c.lt.d $f2, $f4如果**$f2 < $f4**,将Coproc1中的flag 0 置1(true),否则置0(false)c.lt.d 1, $f2, $f4如果**$f2 < $f4**,将Coproc1中的flag 0 置立即数表示的具体数值(true),否则置0(false)c.lt.s $f0, $f1如果**$f0 < $f1**,将Coproc1中的flag 0 置1(true),否则置0(false)c.lt.s 1, $f0, $f1如果**$f0 < $f1**,将Coproc1中的flag 0 置立即数表示的具体数值(true),否则置0(false) 向上取整_Ceil

ceil.w.d $f1, $f2 置$f1为双精度浮点数$f2的向上取整的结果(一个32位整数 → word)

ceil.w.s $f0, $f1 置$f0为单精度浮点数$f1的向上取整的结果(一个32位整数)

计算前导数_Count number of Leading x

clo $t1, $t2 置$t1为$t2的从最高有效位开始的前导1个数

clz $t1, $t2 置$t1为$t2的从最高有效位开始的前导0个数

转换_Convert

留意一下转换规律就好了。前面那个是待置的(d to double, s to single, w to word)。

格式功能概述备注cvt.d.s $f2, $f1置$f2为与单精度浮点数$f1等值的一个双精度浮点数cvt.d.w $f2, $f1置$f2为与32位整数$f1等值的一个双精度浮点数cvt.s.d $f1, $f2置$f1为与双精度浮点数$f2等值的一个单精度浮点数cvt.s.w $f0, $f1置$f0为与32位整数$f2等值的一个单精度浮点数cvt.w.d $f0, $f2置$f0为与双精度浮点数$f2等值的一个32位整数cvt.w.s $f0, $f1置$f0为与单精度浮点数$f1等值的一个32位整数 除法_Div 格式功能概述备注div $t1, $t2将$t1除以$t2,然后置 LO 为商,置 HI 为余数(用mfhi访问HI,mflo访问LO)考虑溢出的除法div.d $f2, $f4, $f6置$f2为$f4 ÷ $f6的双精度浮点数结果两个双精度浮点数的除法div.s $f0, $f1, $f3置$f0为$f1 ÷ $f3的双精度浮点数结果两个单精度浮点数的除法divu $t1, $t2将无符号数$t1除以$t2,然后置 LO 为商,置 HI 为余数(用mfhi访问HI,mflo访问LO)不考虑溢出的除法 异常返回_Exception RETurn

eret 将PC设置为Coproc 0(协处理器) 中epc寄存器的值,并将其中status寄存器的位 1(异常级别)置为0

// 可以在MARS的Coproc 0栏中找到这两个寄存器

向下取整_Floor

floor.w.d $f1, $f2 置$f1为双精度浮点数$f2的向下取整的结果(一个32位整数 → word)

floor.w.s $f0, $f1 置$f0为单精度浮点数$f1的向下取整的结果(一个32位整数)

跳啊跳啊_Jump

绝对地址指令(地址计算不依赖PC值)称为跳转(Jump),助记词以j开头。(注意跟Branch区分)

格式功能概述备注j target跳转到target的地址无条件跳转 Jumpjal target置$ra为PC的返回地址,然后跳转到地址在target中的语句Jump And Linkjalr $t1置$ra为PC的返回地址,然后跳转到地址在t1中的语句Jump And Link Registerjalr $t1, $t2置$t1为PC的返回地址,然后跳转到地址在t2中的语句jr $t1跳转到地址在t1中的语句无条件跳转 Jump Register 加载_Load 格式功能概述备注lb $t1, -100($t2)将 $t1 置为来自有效内存字节地址的符号扩展的 8 位值,或者说,是把内存中地址为x + $t2的数取出来,进行符号扩展扩为8位也即一个字节后,放到$t1里去Load Byte(最后扩展完毕得到的是8位的值,也即一个字节);-100表达的是一个16位有符号整数x(-32768 ~ 32767);常见的用法有令x = 4,这样可以一直往下访问lbu $t1, -100($t2)将 $t1 置为来自有效内存字节地址的0扩展的 8 位值,或者说,是把内存中地址为x + $t2的数取出来,进行0扩展扩为8位也即一个字节后,放到$t1里去无符号unsigned即做0扩展,没什么好说的ldc1 $f2, -100($t2)置FPU寄存器$f2为来自有效内存双字地址(2 * 32 = 64位)的64位值$f2来自Corproc 1lh $t1, -100($t2)为16位值,其他描述同第一行的lbLoad Half Wordlhu $t1, -100($t2)为16位值,其他描述同第二行的lbull $t1, -100($t2)跟sc(Store Conditional)配对进行RMW操作。ll指令负责从内存中读取一个字,以实现接下来的 RMW(Read-Modify-Write,读改写) 操作,而sc指令的功能是向内存中写入一个字,以完成前面的 RMW 操作。Load Link,在MARS中视为等同于加载字 (lw),因为 MARS 不模拟多个处理器。它们不是一个简单的内存读取/写入的函数,当使用ll指令从内存中读取一个字之后, 处理器会记住这次操作(会在 CPU 的寄存器中设置一个不可见的 bit 位),同时这次操作读取的地址也会保存在处理器的寄存器中。 接下来的sc指令,比如 会检查上次ll指令执行后的 RMW 操作是否是原子操作(即不存在其它对这个地址的操作), 如果是则 t 的值将会被更新至内存中,同时 t 的值也会变为1,表示操作成功; 反之(即存在其它对这个地址的访问冲突),则 t 的值不会被更新至内存中,且 t 的值也会变为0,表示操作失败。lui $t1, 100将$t1的高16位置为后面的16位立即数(100表示的),低16位置0Load Upper Immediatelw $t1, -100($t2)为32位值,其他描述同第一行的lbLoad Wordlwc1 $f1, -100($t2)为32位值,其他描述同第三行的ldc1Load Word Coproc 1lwl $t1, -100($t2)对于大端:从所指位置(地址)向高地址方向取数直至地址对齐,且按从低地址至高地址的顺序将数据排序,将排序好的数据存放在寄存器$t1的高位。对于小端:从所指位置(地址)向低地址方向取数直至地址对齐,且按从高地址至低地址的顺序将数据排序,将排序好的数据存放在寄存器$t1的高位。Load Word Leftlwr $t1, -100($t2)对于大端:从所指位置(地址)向低地址方向取数直至地址对齐,且按从低地址至高地址的顺序将数据排序,将排序好的数据存放在寄存器$t1的低位。对于小端:从所指位置(地址)向高低址方向取数直至地址对齐,且按从高地址至低地址的顺序将数据排序,将排序好的数据存放在寄存器$t1的低位Load Word Right 乘加_Multiply Add

madd $t1, $t2 将$t1乘以$t2,然后HI增上乘积的高32位,LO增上乘积的低32位(记得用mfhi访问HI,mflo访问LO)

maddu $t1, $t2 无符号,没什么好说的(前面都有)

移来移去_Move 格式功能概述备注mfc0 $t1, $8置$t1的值为CP0寄存器$8中储存的值在MARS中,它是vaddrMove From Coproc 0mfc1 $t1, $f1置$t1的值为CP1寄存器(FPU寄存器)$f1中储存的值Move From Coproc 1mfhi $t1置$t1的值为HI中的内容用于乘除运算mflo $t1置$t1的值为LO中的内容同上mov.d $f2, $f4置$f2的值为$4中存储的值双精度浮点数mov.s $f0, $f1置$f0的值为$f1中存储的值单精度浮点数movf $t1, $t2如果FPU寄存器的状态标志0(flag 0)值为false,则置 t 1 为 t1为 t1为t2的值movf $t1, $t2, 1如果具体指定的(1表示的0 ~ 7的任意一个数字)FPU寄存器状态标志(flag x)的值为false,则置$t1为$t2的值movf.d $f2, $f4形式基本同上movf.d $f2, $f4, 1形式基本同上movf.s $f0, $f1形式基本同上movf.s $f0, $f1, 1形式基本同上movn $t1, $t2, $t3如果$t3不为0,则置$t1为$t2的值movn.d $f2, $f4, $t3形式基本同上movn.s $f0, $f1, $t3形式基本同上movt $t1, $t2如果FPU寄存器的状态标志0(flag 0)值为true,则置$t1为$t2的值movt $t1, $t2, 1如果具体指定的(1表示的0 ~ 7的任意一个数字)FPU寄存器状态标志(flag x)的值为true,则置$t1为$t2的值movt.d $f2, $f4形式基本同上就都是浮点数精度问题了,后面也不备注了movt.d $f2, $f4, 1形式基本同上movt.s $f0, $f1形式基本同上movt.s $f0, $f1, 1形式基本同上movz $t1, $t2, $t3如果$t3 = 0,则置$t1为$t2的值movz.d $f2, $f4, $t3形式基本同上movz.s $f0, $f1, $t3形式基本同上mtc0 $t1, $8置CP0寄存器$8(vaddr)为$t1中存储的值Move To Coprocessor 0mtc1 $t1, $f1置CP1寄存器$f1(FPU寄存器)为$t1中存储的值Move To Coprocessor 1mthi $t1置HI为$t1中存储的值乘除运算中用mtlo $t1置LO为$t1中存储的值乘除运算中用 乘减_Msub

msub $t1, $t2 将$t1乘以$t2,然后HI减掉乘积的高32位,LO减掉乘积的低32位(记得用mfhi访问HI,mflo访问LO)

msubu $t1, $t2 无符号,没什么好说的

乘法_Mul

mul $t1, $t2, $t3 将$t2 * $t3的高32位存在HI中,低32位存在LO和$t1中,不考虑溢出(mfhi访问HI,mflo访问LO)

mul.d $f2, $f4, $f6 $f2 = $f4 * $f6(双精度浮点数乘法)

mul.s $f0, $f1, $f3 $f0 = $f1 * $f3(单精度浮点数乘法)

mult $t1, $t2 将$t1 * $t2的高32位存在HI中,低32位存在LO中,不考虑溢出(mfhi访问HI,mflo访问LO)

multu $t1, $t2 无符号,没什么好说的

浮点数取反_Neg

neg.d $f2, $f4 置$f2为双精度浮点数$f4取反的结果

neg.s $f0, $f1 置$f0为单精度浮点数$f1取反的结果

无操作_Nop

nop 机器码全为0,空操作

或非_Nor

nor $t1, $t2, $t3 置$t1为 $t2或非$t3 的结果

或运算_Or

or $t1, $t2, $t3 置$t1为 $t2 | $t3 的结果

ori $t1, $t2, 100 置$t1为 $t2 | 16位无符号立即数x(进行0扩展)的结果

浮点数的舍入_Round

round w.d $f1, $f2 将双精度舍入到字 : 置$f1为$f2中的双精度浮点数的32位整数舍入值

round w.s $f0, $f1 将单精度舍入到字 : 置$f0为$f1中的单精度浮点数的32位整数舍入值

存储_Store

sb $t1, -100($t2) 将$t1中的低8位存储到有效内存字节地址中去,或者说,是把$t1中的低8位存储到内存中地址为x(有符号16位整数) + $t2的地方去,store byte

sc $t1, -100($t2) 跟ll指令搭配完成读改写任务,详见前文的ll指令部分(Store Conditional)

sdcl $f2, -100($t2) 将CP1寄存器$f2(FPU寄存器)中的64位值存储到有效内存字节地址中去,或者说,是把$f2中的64位值存储到内存中地址为x(有符号16位整数) + $t2的地方去,store Doubleword

sh $t1, -100($2) 将$t1中的低16位存储到有效内存字节地址中去,或者说,是把$t1中的低16位存储到内存中地址为x(有符号16位整数) + $t2的地方去,store Halfword

sw $t1, -100($t2) 将$t1中的值(32位)存储到有效内存字节地址中去,或者说,是把$t1中的值存储到内存中地址为x(有符号16位整数) + $t2的地方去,store Word

swc1 $f1, -100($t2) 将CP1寄存器$f1(FPU寄存器)中的32位值存储到有效内存字节地址中去,或者说,是把$f1中的32位值存储到内存中地址为x(有符号16位整数) + $t2的地方去,store Word

swl $t1, -100($t2) 将 $t1 的高位1到4字节(4 * 8 = 32)存储到内存中:从高到低分别就是从有效字节地址,也就是内存中地址为x(有符号16位整数) + $t2的地方开始,一直到这个“字”的低位字节,等效于在有效字节地址里存了这个字的“左边”, store word left

swr $t1, -100($t2) 大致同上,只不过是反过来取了$t1的低位1到4字节,等效于在有效字节地址存了这个字的“右边”,store word right

移位_Shift

sll $t1, $t2, 10 将$t2左移x(无符号5位整数,0 ~ 31)位的结果存储到$t1中,逻辑左移操作

sllv $t1, $t2, $t3 大体同上,只不过左移的位数由5位立即数变为$t3中低5位存储的值

sra $t1, $t2, 10 将$t2算术右移x(无符号5位整数,0 ~ 31)位的结果做符号扩展后存储到$t1中

srav $t1, $t2, $t3 大体同上,只不过右移的位数由5位立即数变为$t3中低5位存储的值

srl $t1, $t2, 10 将$t2左移x(无符号5位整数,0 ~ 31)位的结果存储到$t1中,逻辑右移操作

srlv $t1, $t2, $t3 大体同上,只不过右移的位数由5位立即数变为$t3中低5位存储的值

小于则置_Set Less Than

slt $t1, $t2, $t3 如果$t2 < $t3,则置$t1为1,否则置为0(可以看作一个判断)

sltu $t1, $t2, $t3 大体同上,但注意这里是无符号比较!

slti $t1, $t2, -100 大体同slt,只不过$t3换成一个做了符号扩展的16位有符号整数

sltiu $t1, $t2, -100 大体同上,但注意这里是无符号比较!

开方_Sqrt

sqrt.d $f2, $f4 置$f2为双精度浮点数$f4开方的结果,也是一个双精度浮点数

sqrt.s $f0, $f1 换成单精度而已,没什么好说的

减法_Sub

sub $t1, $t2, $t3 置$t1为 $t2 - $t3 的值(考虑溢出)

subu $t1, $t2, $t3 类似,不考虑溢出的结果

sub.d $f2, $f4, $f6 类似,双精度浮点数的减法结果

sub.s $f0, $f1, $f3 类似,单精度浮点数的减法结果

Syscall

syscall 发出系统调用,执行$v0中的值指定的系统调用 (在后续的Syscalls模块中将具体提到不同的$v0的值会引发怎样的操作)

自陷_Trap

TEQ、TNE等都是条件自陷指令。如果条件成立就会引发一个自陷(Trap)异常。自陷指令又叫做访管指令,出现在计算机操作系统中,用于实现在用户态下运行的进程调用操作系统内核程序,即当运行的用户进程或系统实用进程欲请求操作系统内核为其服务时,可以安排执行一条陷入指令引起一次特殊异常。通常自陷指令是给编译器和解释器用的,可以实现运行时数组边界检查之类的操作。

指令差异都是对大小等关系的判断,以及无符号、立即数这老几样,不具体列出了。

在这里插入图片描述

截断_Truncate

trunc.w.d $f1, $f2 置 $f1 为 $f2 中双精度浮点数的 32 位整数截断,Truncate Double To Word

trunc.2.s $f0, $f1 大体相同,单精度浮点数,Truncate Single To Word

异或_Xor

xor $t1, $t2, $t3 按位异或,$t1 = $t2 xor $t3

xori $t1, $t2, 100 大体相同,改$t3值为一个16位无符号整数



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有